package android.demo.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

public class HandlerActivityA extends Activity {

	private final String TAG = "HandlerActivityA";
	private Button btn;   
    private ProgressBar progressBar ;  
	
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		LinearLayout layout = new LinearLayout(this);   
		layout.setOrientation(LinearLayout.VERTICAL);   

		progressBar = new ProgressBar(this);
		btn = new Button(this);
           
		progressBar.setVisibility(View.VISIBLE);
		layout.addView(progressBar);
		
		btn.setId(100);
		btn.setText("开始");
		btn.setOnClickListener(new Button.OnClickListener() {   
  
            public void onClick(View arg0) {   
                /**  
                 * 调用Handler的post方法，将要执行的线程对象添加到线程队列中  
                 */  
                handler.post(handlerThread);   
            }   
               
        }); 
		layout.addView(btn);
		setContentView(layout);       
    }
	
	/**  
     * 使用匿名内部类来复写hanlder当中的hanldrMessage方法  
     * 这里的msg对象就是从线程部分发送过来的对象  
     */  
	Handler handler = new Handler() {   
        public void handleMessage(Message msg)   
        {   
        	progressBar.setProgress(msg.arg1);   
            handler.post(handlerThread);   
        }   
    };   


    //线程类，该类使用的是匿名内部类的方式进行声明   
    Runnable handlerThread = new Runnable() {   
        int i = 0;  
        
        public void run()   
        {   
            Log.i(TAG, "开始线程");   
            i = i + 10;   
            
            /**  
             * 得到一个消息对象，Message类是由android操作系统提供  obtainMessage方法用来得到Message对象  
             */  
            Message msg = handler.obtainMessage();   
            /**  
             * Message中有个成员变量，即msg独享的arg1参数  将其值设置为i。用arg1或arg2这两个成员变量传递  
             * 消息，优点是系统性能消耗较少  
             */  
            msg.arg1 = i;  
            
            try {   
                //当前线程休眠1秒   
                Thread.sleep(5000);   
            } catch (InterruptedException e) {   
                e.printStackTrace();   
            }   
            /**  
             * 发送一个消息，用sendMessage是将msg加入到消息队列中。而post是将线程加入到线程队列中  
             */  
            handler.sendMessage(msg);   
            if( i == 100) {   
                /**  
                 * 如果i=100的时候，就将线程对象 从handler当中移除  
                 */  
                handler.removeCallbacks(handlerThread);   
                progressBar.setVisibility(View.GONE);   
            }   
        }   
    };   


}
